const vscode = require('vscode');
const fs = require('fs-extra');
const path = require('path');
const templateCreator = require('./templateCreator');
const templateAdder = require('./templateAdder');
const templateInserter = require('./templateInserter');
const selectionAdder = require('./selectionAdder');

// 创建输出通道
const outputChannel = vscode.window.createOutputChannel('File Template Utils');

/**
 * 插件激活时调用
 * @param {vscode.ExtensionContext} context
 */
function activate(context) {
    // 显示输出通道
    outputChannel.show();
    outputChannel.appendLine('插件 "file-template-utils" 正在激活...');

    try {
        // 注册从模板创建命令
        let createFromTemplateDisposable = vscode.commands.registerCommand('file-template-utils.createFromTemplate', async (uri) => {
            outputChannel.appendLine(`执行命令: file-template-utils.createFromTemplate，URI: ${uri ? uri.fsPath : '未提供'}`);
            
            if (!uri) {
                const message = '请在资源管理器中右键选择目标位置';
                outputChannel.appendLine(`错误: ${message}`);
                vscode.window.showErrorMessage(message);
                return;
            }

            try {
                // 检查URI是否为文件，如果是文件则获取其父目录
                let targetUri = uri;
                const stat = await fs.stat(uri.fsPath);
                if (stat.isFile()) {
                    // 如果是文件，使用其父目录作为目标位置
                    const parentDir = path.dirname(uri.fsPath);
                    targetUri = vscode.Uri.file(parentDir);
                    outputChannel.appendLine(`URI是文件，使用父目录作为目标位置: ${parentDir}`);
                }

                outputChannel.appendLine(`开始创建文件，目标位置: ${targetUri.fsPath}`);
                const result = await templateCreator.createFromTemplate(targetUri);
                if (result !== false) {
                    outputChannel.appendLine('文件创建成功');
                } else {
                    outputChannel.appendLine('文件创建已取消');
                }
            } catch (error) {
                const message = `创建文件失败: ${error.message}`;
                outputChannel.appendLine(`错误: ${message}`);
                outputChannel.appendLine(`错误堆栈: ${error.stack}`);
                vscode.window.showErrorMessage(message);
            }
        });

        // 注册添加到模板库命令
        let addToTemplateLibraryDisposable = vscode.commands.registerCommand('file-template-utils.addToTemplateLibrary', async (uri) => {
            outputChannel.appendLine(`执行命令: file-template-utils.addToTemplateLibrary，URI: ${uri ? uri.fsPath : '未提供'}`);
            
            if (!uri) {
                const message = '请在资源管理器中右键选择文件或文件夹';
                outputChannel.appendLine(`错误: ${message}`);
                vscode.window.showErrorMessage(message);
                return;
            }

            try {
                outputChannel.appendLine(`开始添加到模板库，源位置: ${uri.fsPath}`);
                const result = await templateAdder.addToTemplateLibrary(uri);
                if (result !== false) {
                    outputChannel.appendLine('添加到模板库成功');
                } else {
                    outputChannel.appendLine('添加到模板库已取消');
                }
            } catch (error) {
                const message = `添加到模板库失败: ${error.message}`;
                outputChannel.appendLine(`错误: ${message}`);
                outputChannel.appendLine(`错误堆栈: ${error.stack}`);
                vscode.window.showErrorMessage(message);
            }
        });

        context.subscriptions.push(createFromTemplateDisposable);
        context.subscriptions.push(addToTemplateLibraryDisposable);
        
        // 注册从模板插入内容命令
        let insertFromTemplateDisposable = vscode.commands.registerCommand('file-template-utils.insertFromTemplate', async (options) => {
            outputChannel.appendLine(`执行命令: file-template-utils.insertFromTemplate`);
            
            try {
                outputChannel.appendLine(`开始从模板插入内容`);
                const result = await templateInserter.insertFromTemplate(options);
                if (result !== false) {
                    outputChannel.appendLine('从模板插入内容成功');
                } else {
                    outputChannel.appendLine('从模板插入内容已取消');
                }
            } catch (error) {
                const message = `从模板插入内容失败: ${error.message}`;
                outputChannel.appendLine(`错误: ${message}`);
                outputChannel.appendLine(`错误堆栈: ${error.stack}`);
                vscode.window.showErrorMessage(message);
            }
        });
        
        // 注册将选中内容添加到模板库命令
        let addSelectionToTemplateDisposable = vscode.commands.registerCommand('file-template-utils.addSelectionToTemplate', async () => {
            outputChannel.appendLine(`执行命令: file-template-utils.addSelectionToTemplate`);
            
            try {
                outputChannel.appendLine(`开始将选中内容添加到模板库`);
                const result = await selectionAdder.addSelectionToTemplate();
                if (result !== false) {
                    outputChannel.appendLine('将选中内容添加到模板库成功');
                } else {
                    outputChannel.appendLine('将选中内容添加到模板库已取消');
                }
            } catch (error) {
                const message = `将选中内容添加到模板库失败: ${error.message}`;
                outputChannel.appendLine(`错误: ${message}`);
                outputChannel.appendLine(`错误堆栈: ${error.stack}`);
                vscode.window.showErrorMessage(message);
            }
        });
        

        
        context.subscriptions.push(insertFromTemplateDisposable);
        context.subscriptions.push(addSelectionToTemplateDisposable);
        
        outputChannel.appendLine('插件 "file-template-utils" 已成功激活');
    } catch (error) {
        outputChannel.appendLine(`插件激活失败: ${error.message}`);
        outputChannel.appendLine(`错误堆栈: ${error.stack}`);
    }
}

/**
 * 插件停用时调用
 */
function deactivate() {
    outputChannel.appendLine('插件 "file-template-utils" 已停用');
}

module.exports = {
    activate,
    deactivate
};